/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CargaDocumentoPresentacion.java
 *
 * Created on 27/12/2010, 09:34:54
 */

package presentacion.documento;

import com.toedter.calendar.IDateEditor;
import hibernate.objeto.Documento;
import java.awt.Cursor;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.RowFilter;
import javax.swing.SpinnerDateModel;
import javax.swing.table.TableRowSorter;
import logica.CapaLogica;
import logica.DocumentoLogica;
import logica.validacion.CapaValidacion;
import logica.validacion.PersonaValidacion;
import presentacion.CapaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.Paginador;
import presentacion.utilidad.tabla.MiModeloTabla;

/**
 *
 * @author usuario
 */
public class DocumentoPresentacion extends javax.swing.JDialog {

    /** Creates new form ExamenComplementarioPresentacion */
    public DocumentoPresentacion(java.awt.Frame parent, boolean modal,
            boolean esConsentimientoInformado) {
        super(parent, modal);
        initComponents();
        
        this.esConsentimientoInformado = esConsentimientoInformado;
        documentoACargar = new Documento();

        personalizarGUI();
        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        setLocationRelativeTo(null);
        setearEventosQueCapturanTeclaEnterYEscape();
    }

    /**
     * Setea datos de la ventana.
     *
     */
    private void personalizarGUI() {
        //Crea la barra de menu
        this.setJMenuBar(BarMenu.createMenuBarCargaDocumento(
                tablaCargaDocumento, this));

        iniciarPaginador();
        cargarTablaDocumento();

        if (esConsentimientoInformado) {
            personalizarConsentimientoInformado();
        } else {
            personalizarFichaDeSeguimiento();
        }

        if (CapaPresentacion.modoCarga) {
            modoCarga();
        } else if (CapaPresentacion.modoModificacion) {
            ;
        } else if (CapaPresentacion.modoVisualizacion) {
            modoVisualizacion();
        }
        
        botonCargarDocumento.setVisible(false);
        botonEliminarDocumento.setVisible(false);
    }

    /**
     * Setea la ventana en modo carga.
     * 
     */
    private void modoCarga() {
        horaDocumento.getModel().setValue(new Date());
        fechaDocumento.setDate(new Date());
    }

    /**
     * Setea la ventana en modo visualización.
     * 
     */
    private void modoVisualizacion() {
        textoDescriptivoCargaDocumento.setText("Seleccione un" +
                " documento para ver sus propiedades");

        setearEstadoCampos(false);
        botonCancelar.requestFocus();
        CapaPresentacion.personalizarBotonesEnVisualizacion(
                    botonAceptar, botonCancelar);
    }
    
    /**
     * Personaliza la ventana en caso de carga de ficha de seguimiento
     * 
     */
    private void personalizarConsentimientoInformado() {
        this.setTitle("Consentimiento Informado");
        textoDescriptivoVisualizacionCargaDocumento.setText(
                "Lista de consentimientos informados cargados");
        
        textoDescriptivoCargaDocumento.setText(
                "Ingrese los datos del consentimiento informado");
        
        botonCargarDocumento.setText(
                "Agregar consentimiento");
        botonCargarDocumento.setMnemonic(
                'c');
        botonCargarDocumento.setToolTipText(
                "Agrega los datos para cargar una consentimiento informado");
        
        botonEliminarDocumento.setText(
                "Eliminar consentimiento");
        botonEliminarDocumento.setToolTipText(
                "Elimina el consentimiento informado seleccionado");
        
        //Carga la tabla de consentimiento informado
        MiModeloTabla.cargarTablaDocumento(
                DocumentoLogica.getVectorDocumentoPorTipo("consentimiento informado"),
                tablaCargaDocumento);
    }
    
    /**
     * Personaliza la ventana en caso de carga de ficha de seguimiento
     * 
     */
    private void personalizarFichaDeSeguimiento() {
        this.setTitle("Ficha de Seguimiento");
        textoDescriptivoVisualizacionCargaDocumento.setText(
                "Lista de fichas de seguimiento cargadas");
        
        textoDescriptivoCargaDocumento.setText(
                "Ingrese los datos de la ficha de seguimiento");
        
        botonCargarDocumento.setText(
                "Agregar ficha");
        botonCargarDocumento.setMnemonic(
                'f');
        botonCargarDocumento.setToolTipText(
                "Agrega los datos para cargar una ficha de seguimiento");
        
        botonEliminarDocumento.setText(
                "Eliminar ficha");
        botonEliminarDocumento.setToolTipText(
                "Elimina la ficha de seguimiento seleccionada");
    }

    /**
     * Carga la tabla de los documentos.
     * 
     */
    private void cargarTablaDocumento() {
        //Si corresponde vuelve a cero el indice del paginador, de lo contrario
        //Lo deja en el valor que se encuentra
        Paginador.actualizaIndice(0);
        if (esConsentimientoInformado) {
            //Carga la tabla de consentimiento informado
            MiModeloTabla.cargarTablaDocumento(
                    DocumentoLogica.getVectorDocumentoPorTipo("consentimiento informado"),
                    tablaCargaDocumento);
        } else {
            //Carga la tabla de ficha de seguimiento
            MiModeloTabla.cargarTablaDocumento(
                    DocumentoLogica.getVectorDocumentoPorTipo("ficha de seguimiento"),
                    tablaCargaDocumento);
        }
    }
    
    /**
     * Visualiza en pantalla las distintas propiedades del objeto.
     *
     * @param documento El objeto Documento a visualizar
     */
    private void exhibirDatosEnPantalla(Documento documento) {
        String horaEnString = documento.getHoraDocumento();
        horaDocumento.getModel().setValue(new Date(0, 0, 0,
                CapaLogica.separarHoras(horaEnString),
                CapaLogica.separarMinutos(horaEnString),
                CapaLogica.separarSegundos(horaEnString)));
        fechaDocumento.setDate(
                documento.getFechaDocumento());

        nombreDocumento.setText(
                documento.getNombreDocumento());
        nombreDocumento.setCaretPosition(0);
        
        nombreAutorDocumento.setText(
                documento.getNombreAutorDocumento());
        nombreAutorDocumento.setCaretPosition(0);

        apellidoAutorDocumento.setText(
                documento.getApellidoAutorDocumento());
        apellidoAutorDocumento.setCaretPosition(0);

        botonAdjuntoDocumento.setIcon(Icono.ICONO_16_QUITAR);
        botonAdjuntoDocumento.setToolTipText("Quitar");
        adjuntoDocumento.setText(
                "<html><u>" + CapaLogica.
                reemplazarDosBarrasInvertidasPorUnaBarraInvertida(
                documentoAVisualizar.getNombreArchivoDocumento()) + "</u>"
                );
        adjuntoDocumento.setToolTipText("Click para ver: " + CapaLogica.
                reemplazarDosBarrasInvertidasPorUnaBarraInvertida(
                documentoAVisualizar.getNombreArchivoDocumento()));
        adjuntoDocumento.setForeground(Fuente.COLOR_HIPERVINCULO);

        comentarioDocumento.setText(
                documento.getComentarioDocumento());
        comentarioDocumento.setCaretPosition(0);
    }

    /**
     * Setea el estado de los campos.
     *
     * @param estado El estado a setear
     */
    private void setearEstadoCampos(boolean estado) {
        horaDocumento.setEnabled(estado);
        fechaDocumento.setEnabled(estado);
        nombreDocumento.setEnabled(estado);
        nombreAutorDocumento.setEnabled(estado);
        apellidoAutorDocumento.setEnabled(estado);
        adjuntoDocumento.setEnabled(estado);
        comentarioDocumento.setEnabled(estado);
    }
    
    /**
     * Limpia pantalla.
     *
     */
    private void limpiarPantalla() {
        horaDocumento.getModel().setValue(new Date());
        fechaDocumento.setDate(new Date());
        nombreDocumento.setText("");
        nombreAutorDocumento.setText("");
        apellidoAutorDocumento.setText("");
        botonAdjuntoDocumento.setText("Adjunto");
        botonAdjuntoDocumento.setIcon(Icono.ICONO_16_AGREGAR);
        adjuntoDocumento.setText("");
        comentarioDocumento.setText("");
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelVisualizacionCargaDocumento = new javax.swing.JPanel();
        textoDescriptivoVisualizacionCargaDocumento = new javax.swing.JLabel();
        textoFiltrar = new javax.swing.JLabel();
        filtrar = new javax.swing.JTextField();
        tablaCargaDocumentoScrollPanel = new javax.swing.JScrollPane();
        tablaCargaDocumento = new javax.swing.JTable(new MiModeloTabla());
        paginadorUno = new javax.swing.JPanel();
        botonAnteriorPaginadorUno = new javax.swing.JButton();
        botonSiguientePaginadorUno = new javax.swing.JButton();
        textoDescriptivoCargaDocumento = new javax.swing.JLabel();
        botonEliminarDocumento = new javax.swing.JButton();
        botonCargarDocumento = new javax.swing.JButton();
        panelCargaDocumento = new javax.swing.JPanel();
        textoHoraYFechaDocumento = new javax.swing.JLabel();
        SpinnerDateModel spinerModel = new SpinnerDateModel(new Date(0, 0, 0, Calendar.HOUR_OF_DAY, 0, 0), null, null, Calendar.HOUR_OF_DAY);
        horaDocumento = new javax.swing.JSpinner(spinerModel);
        fechaDocumento = new com.toedter.calendar.JDateChooser();
        textoNombreDocumento = new javax.swing.JLabel();
        nombreDocumento = new javax.swing.JTextField();
        textoNombreAutorDocumento = new javax.swing.JLabel();
        nombreAutorDocumento = new javax.swing.JTextField();
        textoApellidoAutorDocumento = new javax.swing.JLabel();
        apellidoAutorDocumento = new javax.swing.JTextField();
        botonAdjuntoDocumento = new javax.swing.JButton();
        adjuntoDocumento = new javax.swing.JLabel();
        textoComentarioDocumento = new javax.swing.JLabel();
        comentarioDocumentoScrollPanel = new javax.swing.JScrollPane();
        comentarioDocumento = new javax.swing.JTextArea();
        jSeparator1 = new javax.swing.JSeparator();
        botonAceptar = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("");
        setMinimumSize(new java.awt.Dimension(965, 717));

        panelVisualizacionCargaDocumento.setMinimumSize(new java.awt.Dimension(0, 0));
        panelVisualizacionCargaDocumento.setPreferredSize(new java.awt.Dimension(1004, 201));

        textoDescriptivoVisualizacionCargaDocumento.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoVisualizacionCargaDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVisualizacionCargaDocumento.setPreferredSize(new java.awt.Dimension(500, 23));

        textoFiltrar.setFont(Fuente.FUENTE_LABEL);
        textoFiltrar.setText("Filtrar");
        textoFiltrar.setPreferredSize(new java.awt.Dimension(28, 20));

        filtrar.setToolTipText("Filtra los datos encontrados por algún criterio");
        filtrar.setPreferredSize(new java.awt.Dimension(200, 20));
        filtrar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                filtrarKeyReleased(evt);
            }
        });

        tablaCargaDocumentoScrollPanel.setPreferredSize(new java.awt.Dimension(984, 132));

        tablaCargaDocumento.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaCargaDocumentoMouseClicked(evt);
            }
        });
        tablaCargaDocumento.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tablaCargaDocumentoKeyReleased(evt);
            }
        });
        tablaCargaDocumentoScrollPanel.setViewportView(tablaCargaDocumento);

        paginadorUno.setMaximumSize(new java.awt.Dimension(700, 14));

        botonAnteriorPaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonAnteriorPaginadorUno.setIcon(Icono.ICONO_16_ANTERIOR);
        botonAnteriorPaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonAnteriorPaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAnteriorPaginadorUnoActionPerformed(evt);
            }
        });

        botonSiguientePaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonSiguientePaginadorUno.setIcon(Icono.ICONO_16_SIGUIENTE);
        botonSiguientePaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonSiguientePaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaginadorUnoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout paginadorUnoLayout = new javax.swing.GroupLayout(paginadorUno);
        paginadorUno.setLayout(paginadorUnoLayout);
        paginadorUnoLayout.setHorizontalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createSequentialGroup()
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        paginadorUnoLayout.setVerticalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout panelVisualizacionCargaDocumentoLayout = new javax.swing.GroupLayout(panelVisualizacionCargaDocumento);
        panelVisualizacionCargaDocumento.setLayout(panelVisualizacionCargaDocumentoLayout);
        panelVisualizacionCargaDocumentoLayout.setHorizontalGroup(
            panelVisualizacionCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVisualizacionCargaDocumentoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelVisualizacionCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(tablaCargaDocumentoScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelVisualizacionCargaDocumentoLayout.createSequentialGroup()
                        .addComponent(textoDescriptivoVisualizacionCargaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 252, Short.MAX_VALUE)
                        .addComponent(textoFiltrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelVisualizacionCargaDocumentoLayout.setVerticalGroup(
            panelVisualizacionCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelVisualizacionCargaDocumentoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelVisualizacionCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelVisualizacionCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(textoFiltrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(textoDescriptivoVisualizacionCargaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tablaCargaDocumentoScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        MiModeloTabla.inicializarTabla(tablaCargaDocumento);

        textoDescriptivoCargaDocumento.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoCargaDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoCargaDocumento.setPreferredSize(new java.awt.Dimension(500, 23));

        botonEliminarDocumento.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonEliminarDocumento.setForeground(Fuente.COLOR_NORMAL);
        botonEliminarDocumento.setIcon(Icono.ICONO_16_QUITAR);
        botonEliminarDocumento.setToolTipText("");
        botonEliminarDocumento.setPreferredSize(new java.awt.Dimension(175, 20));
        botonEliminarDocumento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarDocumentoActionPerformed(evt);
            }
        });

        botonCargarDocumento.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonCargarDocumento.setForeground(Fuente.COLOR_NORMAL);
        botonCargarDocumento.setIcon(Icono.ICONO_16_AGREGAR);
        botonCargarDocumento.setToolTipText("");
        botonCargarDocumento.setPreferredSize(new java.awt.Dimension(175, 20));
        botonCargarDocumento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCargarDocumentoActionPerformed(evt);
            }
        });

        panelCargaDocumento.setForeground(Fuente.COLOR_NORMAL);

        textoHoraYFechaDocumento.setFont(Fuente.FUENTE_LABEL);
        textoHoraYFechaDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoHoraYFechaDocumento.setText("Hora y fecha");
        textoHoraYFechaDocumento.setPreferredSize(new java.awt.Dimension(103, 20));

        JSpinner.DateEditor horaDeMuerte = new JSpinner.DateEditor(horaDocumento, "HH:mm:ss");
        horaDocumento.setEditor(horaDeMuerte);
        horaDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        horaDocumento.setPreferredSize(new java.awt.Dimension(128, 20));

        fechaDocumento.setToolTipText("");
        fechaDocumento.setDate(new Date());
        fechaDocumento.setMaxSelectableDate(new Date());
        fechaDocumento.setMinSelectableDate(new java.util.Date(-2208985673000L));
        fechaDocumento.setPreferredSize(new java.awt.Dimension(144, 20));

        textoNombreDocumento.setFont(Fuente.FUENTE_LABEL);
        textoNombreDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoNombreDocumento.setText("Nombre");
        textoNombreDocumento.setPreferredSize(new java.awt.Dimension(103, 20));

        nombreDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        nombreDocumento.setForeground(Fuente.COLOR_NORMAL);
        nombreDocumento.setPreferredSize(new java.awt.Dimension(278, 20));

        textoNombreAutorDocumento.setFont(Fuente.FUENTE_LABEL);
        textoNombreAutorDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoNombreAutorDocumento.setText("Nombre autor");
        textoNombreAutorDocumento.setPreferredSize(new java.awt.Dimension(103, 20));

        nombreAutorDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        nombreAutorDocumento.setForeground(Fuente.COLOR_NORMAL);
        nombreAutorDocumento.setPreferredSize(new java.awt.Dimension(278, 20));

        textoApellidoAutorDocumento.setFont(Fuente.FUENTE_LABEL);
        textoApellidoAutorDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoApellidoAutorDocumento.setText("Apellido autor");
        textoApellidoAutorDocumento.setPreferredSize(new java.awt.Dimension(103, 20));

        apellidoAutorDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        apellidoAutorDocumento.setForeground(Fuente.COLOR_NORMAL);
        apellidoAutorDocumento.setPreferredSize(new java.awt.Dimension(278, 20));

        botonAdjuntoDocumento.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonAdjuntoDocumento.setForeground(Fuente.COLOR_NORMAL);
        botonAdjuntoDocumento.setIcon(Icono.ICONO_16_AGREGAR);
        botonAdjuntoDocumento.setText("Adjunto");
        botonAdjuntoDocumento.setToolTipText("Busca la ruta del archivo (hasta 1 Gb)");
        botonAdjuntoDocumento.setPreferredSize(new java.awt.Dimension(103, 20));
        botonAdjuntoDocumento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAdjuntoDocumentoActionPerformed(evt);
            }
        });

        adjuntoDocumento.setFont(Fuente.FUENTE_LABEL);
        adjuntoDocumento.setForeground(Fuente.COLOR_NORMAL);
        adjuntoDocumento.setPreferredSize(new java.awt.Dimension(278, 20));
        adjuntoDocumento.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                adjuntoDocumentoMouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                adjuntoDocumentoMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                adjuntoDocumentoMouseExited(evt);
            }
        });

        textoComentarioDocumento.setFont(Fuente.FUENTE_LABEL);
        textoComentarioDocumento.setForeground(Fuente.COLOR_NORMAL);
        textoComentarioDocumento.setText("Comentario");
        textoComentarioDocumento.setPreferredSize(new java.awt.Dimension(103, 20));

        comentarioDocumentoScrollPanel.setPreferredSize(new java.awt.Dimension(459, 411));

        comentarioDocumento.setColumns(20);
        comentarioDocumento.setFont(Fuente.FUENTE_TEXTFIELD);
        comentarioDocumento.setForeground(Fuente.COLOR_NORMAL);
        comentarioDocumento.setLineWrap(true);
        comentarioDocumento.setRows(2);
        comentarioDocumento.setWrapStyleWord(true);
        comentarioDocumento.setMinimumSize(new java.awt.Dimension(0, 0));
        comentarioDocumento.setPreferredSize(new java.awt.Dimension(278, 100));
        comentarioDocumentoScrollPanel.setViewportView(comentarioDocumento);

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jSeparator1.setPreferredSize(new java.awt.Dimension(5, 10));

        javax.swing.GroupLayout panelCargaDocumentoLayout = new javax.swing.GroupLayout(panelCargaDocumento);
        panelCargaDocumento.setLayout(panelCargaDocumentoLayout);
        panelCargaDocumentoLayout.setHorizontalGroup(
            panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                        .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(textoApellidoAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoNombreDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoNombreAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoHoraYFechaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                                .addComponent(horaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(fechaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(nombreAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(apellidoAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(nombreDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                        .addComponent(botonAdjuntoDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(adjuntoDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 5, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textoComentarioDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(comentarioDocumentoScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        panelCargaDocumentoLayout.setVerticalGroup(
            panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelCargaDocumentoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(comentarioDocumentoScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(textoComentarioDocumento, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCargaDocumentoLayout.createSequentialGroup()
                        .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(horaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(fechaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoHoraYFechaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                                .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                    .addComponent(textoNombreDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(nombreDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(textoNombreAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(11, 11, 11)
                                .addComponent(textoApellidoAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(panelCargaDocumentoLayout.createSequentialGroup()
                                .addGap(31, 31, 31)
                                .addComponent(nombreAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(apellidoAutorDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(11, 11, 11)
                        .addGroup(panelCargaDocumentoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(botonAdjuntoDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(adjuntoDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap())
        );

        botonAceptar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonAceptar.setForeground(Fuente.COLOR_NORMAL);
        botonAceptar.setIcon(Icono.ICONO_16_ACEPTAR);
        botonAceptar.setText("Aceptar");
        botonAceptar.setToolTipText("Agrega el documento");
        botonAceptar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        botonCancelar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonCancelar.setForeground(Fuente.COLOR_NORMAL);
        botonCancelar.setIcon(Icono.ICONO_16_CANCELAR);
        botonCancelar.setText("Cancelar");
        botonCancelar.setToolTipText("Cancela la operación");
        botonCancelar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelVisualizacionCargaDocumento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(textoDescriptivoCargaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 148, Short.MAX_VALUE)
                        .addComponent(botonEliminarDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonCargarDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelCargaDocumento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelVisualizacionCargaDocumento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(textoDescriptivoCargaDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonEliminarDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonCargarDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelCargaDocumento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        this.dispose();
}//GEN-LAST:event_botonCancelarActionPerformed

    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        //Resetea paginador
        Paginador.paginarElemento[0] = false;
        agregarOModificarDocumento();
}//GEN-LAST:event_botonAceptarActionPerformed

    private void tablaCargaDocumentoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaCargaDocumentoMouseClicked
        cargarOVerPropiedadesDocumento();
}//GEN-LAST:event_tablaCargaDocumentoMouseClicked

    private void tablaCargaDocumentoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tablaCargaDocumentoKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_UP
                || evt.getKeyCode() == KeyEvent.VK_DOWN) {
            cargarOVerPropiedadesDocumento();
        }
}//GEN-LAST:event_tablaCargaDocumentoKeyReleased

    private void filtrarKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_filtrarKeyReleased
        TableRowSorter<MiModeloTabla> sorter = new TableRowSorter<MiModeloTabla>
                ((MiModeloTabla) tablaCargaDocumento.getModel());

        tablaCargaDocumento.setRowSorter(sorter);
        String texto = filtrar.getText();
        if (texto.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter("(?i).*" + texto + ".*"));
        }
}//GEN-LAST:event_filtrarKeyReleased

    private void botonAdjuntoDocumentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAdjuntoDocumentoActionPerformed
        if (botonAdjuntoDocumento.getIcon().equals(Icono.ICONO_16_AGREGAR)) {
            JFileChooser seleccionarArchivo = new JFileChooser();
            int seleccion = seleccionarArchivo.showOpenDialog(this);

            if (seleccion == JFileChooser.APPROVE_OPTION) {
                adjuntoDocumento.setText(
                        seleccionarArchivo.getSelectedFile().toString());
                adjuntoDocumento.setToolTipText(adjuntoDocumento.getText());
                adjuntoDocumento.setFont(Fuente.FUENTE_LABEL);
                adjuntoDocumento.setForeground(Fuente.COLOR_NORMAL);
                botonAdjuntoDocumento.setIcon(Icono.ICONO_16_QUITAR);
                botonAdjuntoDocumento.setToolTipText("Quita el adjunto");
            } else {
                adjuntoDocumento.setText("");
                botonAdjuntoDocumento.setIcon(Icono.ICONO_16_AGREGAR);
                botonAdjuntoDocumento.setToolTipText(
                        "Busca la ruta del archivo (hasta 1 Gb)");
            }
            
        } else {
            adjuntoDocumento.setText("");
            botonAdjuntoDocumento.setIcon(Icono.ICONO_16_AGREGAR);
            botonAdjuntoDocumento.setToolTipText(
                    "Busca la ruta del archivo (hasta 1 Gb)");
        }
}//GEN-LAST:event_botonAdjuntoDocumentoActionPerformed

    private void botonCargarDocumentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCargarDocumentoActionPerformed
        cargarDocumento();
}//GEN-LAST:event_botonCargarDocumentoActionPerformed

    private void botonEliminarDocumentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarDocumentoActionPerformed
        eliminarDocumento();
}//GEN-LAST:event_botonEliminarDocumentoActionPerformed

    private void adjuntoDocumentoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_adjuntoDocumentoMouseClicked
        if(evt.getButton() == 1 && adjuntoDocumento.getForeground().equals(
                Fuente.COLOR_HIPERVINCULO)) {
            CapaPresentacion.abrirArchivo(
                    documentoAVisualizar.getIdDocumento(),
                    documentoAVisualizar.getNombreArchivoDocumento(),
                    documentoAVisualizar.getArchivoDocumento(),
                    true);
        }
    }//GEN-LAST:event_adjuntoDocumentoMouseClicked

    private void adjuntoDocumentoMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_adjuntoDocumentoMouseEntered
        if (adjuntoDocumento.getForeground().equals(Fuente.COLOR_HIPERVINCULO)) {
            setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        }
    }//GEN-LAST:event_adjuntoDocumentoMouseEntered

    private void adjuntoDocumentoMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_adjuntoDocumentoMouseExited
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }//GEN-LAST:event_adjuntoDocumentoMouseExited

    private void botonAnteriorPaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAnteriorPaginadorUnoActionPerformed
        paginarAtrasTablaDocumento();
}//GEN-LAST:event_botonAnteriorPaginadorUnoActionPerformed

    private void botonSiguientePaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaginadorUnoActionPerformed
        paginarAdelanteTablaDocumento();
}//GEN-LAST:event_botonSiguientePaginadorUnoActionPerformed

    /**
     * Habilita la carga de un nuevo documentos.
     * 
     */
    private void cargarDocumento() {
        habilitarCarga();
        //Deselecciona lo seleccionado en la tabla
        tablaCargaDocumento.clearSelection();
        botonCargarDocumento.setVisible(false);
        botonEliminarDocumento.setVisible(false);
        documentoACargar = new Documento();
        documentoAVisualizar = null;
    }
    
    /**
     * Al seleccionar un documento de la tabla deben inhabilitarse los campos de 
     * carga. Si el objeto es nulo se permite el ingresos de los datos.
     * 
     */
    private void cargarOVerPropiedadesDocumento() {
        //Recupera lo seleccionado de tabla
        documentoAVisualizar = (Documento)
                MiModeloTabla.recuperarObjetoDeTabla(
                Documento.class.getName(), tablaCargaDocumento);

        if (documentoAVisualizar == null && (
                CapaPresentacion.modoCarga)) {
            habilitarCarga();
            botonCargarDocumento.setVisible(false);
            botonEliminarDocumento.setVisible(false);

        } else if (documentoAVisualizar == null &&
                CapaPresentacion.modoVisualizacion) {
            botonCargarDocumento.setVisible(false);
            botonEliminarDocumento.setVisible(false);

        } else if (documentoAVisualizar != null &&
                CapaPresentacion.modoModificacion) {
            habilitarPropiedades(true);
            botonCargarDocumento.setVisible(true);
            botonEliminarDocumento.setVisible(true);

        } else if (documentoAVisualizar != null &&
                CapaPresentacion.modoVisualizacion) {
            habilitarPropiedades(false);
            botonCargarDocumento.setVisible(false);
            botonEliminarDocumento.setVisible(false);
        }
    }

    /**
     * Habilita los campos necesarios para cargar un documento.
     *
     */
    public void habilitarCarga() {
        if (esConsentimientoInformado) {
            textoDescriptivoCargaDocumento.setText(
                    "Ingrese los datos del consentimiento informado");
        } else {
            textoDescriptivoCargaDocumento.setText(
                    "Ingrese los datos de la ficha de seguimiento");
        }
        
        limpiarPantalla();
        
        //Deselecciona lo seleccionado en la tabla
        tablaCargaDocumento.clearSelection();
        botonCargarDocumento.setVisible(false);
        documentoACargar = null;
    }

    /**
     * Habilita los campos necesarios para visualizar propiedades del documento.
     *
     * @param permiteModificar true si se permite modificación, false en caso
     * contrario
     */
    public void habilitarPropiedades(boolean permiteModificar) {
        textoDescriptivoCargaDocumento.setText("Propiedades");
        exhibirDatosEnPantalla(documentoAVisualizar);
        botonCargarDocumento.setVisible(true);
        setearEstadoCampos(permiteModificar);
    }
    
    /**
     * Elimina el documento seleccionado.
     *
     */
    public void eliminarDocumento() {
        if (documentoAVisualizar != null &&
                MensajePresentacion.confimarEliminacionObjeto(
                "documento", "el") == JOptionPane.OK_OPTION) {
            DocumentoLogica.eliminarDocumento(documentoAVisualizar);
            actualizarDocumentoCargadoOEliminado(false);
        }
    }
    
    /**
     * Agrega/modifica un documento.
     * 
     */
    public void agregarOModificarDocumento() {
        //Valida todos los campos
        if (validarCampos()) {
            //Confirmar modificación
            if (confirmarModificacion()) {
                //Carga toda la información de la pantalla
                recopilarInformacion();
                int[] idDocumento = new int[1];
                if (DocumentoLogica.agregarOModificarDocumento(
                        datosDocumento, documentoAVisualizar, idDocumento)) {
                    documentoACargar = DocumentoLogica.getDocumentoPorId(
                            idDocumento[0]);
                    actualizarDocumentoCargadoOEliminado(true);
                }
            }
        //Errores
        } else {
            MensajePresentacion.errorDatosInvalidos();
        }
    }
    
    /**
     * Al agregarse un nuevo documento se actualiza la tabla y se selecciona por 
     * defecto el agregado mostrandose las propiedades del mismo.
     * 
     * @param esCarga true si se cargó un documento, false si se eliminó un documento
     */
    private void actualizarDocumentoCargadoOEliminado(boolean esCarga) {
        if (esConsentimientoInformado) {
            //Carga la tabla de consentimiento informado
            MiModeloTabla.cargarTablaDocumento(
                DocumentoLogica.getVectorDocumentoPorTipo("consentimiento informado"),
                tablaCargaDocumento);
        } else {
            //Carga la tabla de fichas de seguimiento
            MiModeloTabla.cargarTablaDocumento(
                DocumentoLogica.getVectorDocumentoPorTipo("ficha de seguimiento"),
                tablaCargaDocumento);
        }

        if (esCarga) {
            //Se cargó un usuario
            while(!MiModeloTabla.seleccionarFilaDeTabla(String.valueOf(
                documentoACargar.getIdDocumento()),
                tablaCargaDocumento, tablaCargaDocumentoScrollPanel)) {
                paginarAdelanteTablaDocumento();
            }
            
            cargarOVerPropiedadesDocumento();
        } else {
            //Se eliminó un documento
            habilitarCarga();
            botonCargarDocumento.setVisible(false);
            botonEliminarDocumento.setVisible(false);
        }
    }

    /**
     * Realiza la validación de los datos
     * 
     * @return true si esta listo para cargarse, false en caso contrario
     */
    private boolean validarCampos() {
        boolean esFechaValida = false;
        boolean esNombreValida = false;
        boolean esNombreAutorValida = false;
        boolean esApellidoAutorValida = false;
        boolean esAdjuntoValida = false;

        //Manejo de la validación de fecha
        if (!CapaValidacion.validarFecha(fechaDocumento.getDate(), null, true)) {
            textoHoraYFechaDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoHoraYFechaDocumento.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_HORA_Y_FECHA);
            esFechaValida = false;
        } else {
            textoHoraYFechaDocumento.setForeground(
                    Fuente.COLOR_NORMAL);
            textoHoraYFechaDocumento.setToolTipText(null);
            esFechaValida = true;
        }

        //Manejo de la validación del nombre
        if (!CapaValidacion.validarCampoObligatorio(nombreDocumento.getText())) {
            textoNombreDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoNombreDocumento.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_NOMBRE);
            esNombreValida = false;
        } else {
            textoNombreDocumento.setForeground(
                    Fuente.COLOR_NORMAL);
            textoNombreDocumento.setToolTipText(null);
            esNombreValida = true;
        }
        
        //Manejo de la validación del nombre del autor
        if (!PersonaValidacion.validarNombre(
                nombreAutorDocumento.getText(), false)) {
            textoNombreAutorDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoNombreAutorDocumento.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_NOMBRE);
            esNombreAutorValida = false;
        } else {
            textoNombreAutorDocumento.setForeground(
                    Fuente.COLOR_NORMAL);
            textoNombreAutorDocumento.setToolTipText(null);
            esNombreAutorValida = true;
        }
        
        //Manejo de la validación del apellido del autor
        if (!PersonaValidacion.validarApellido(
                apellidoAutorDocumento.getText(), false)) {
            textoApellidoAutorDocumento.setForeground(
                    Fuente.COLOR_ERROR);
            textoApellidoAutorDocumento.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_APELLIDO);
            esApellidoAutorValida = false;
        } else {
            textoApellidoAutorDocumento.setForeground(
                    Fuente.COLOR_NORMAL);
            textoApellidoAutorDocumento.setToolTipText(null);
            esApellidoAutorValida = true;
        }

        //Manejo de la validación del adjunto
        if (!CapaValidacion.validarArchivo(adjuntoDocumento.getText(), true)) {
           botonAdjuntoDocumento.setForeground(
                   Fuente.COLOR_ERROR);
           botonAdjuntoDocumento.setToolTipText(InformeError.
                    INFORME_ERROR_USO_COMUN_ARCHIVO);
           esAdjuntoValida = false;
        } else {
           botonAdjuntoDocumento.setForeground(Fuente.COLOR_NORMAL);
           botonAdjuntoDocumento.setToolTipText(
                   "Busca la ruta del archivo (hasta 1 Gb)");
           esAdjuntoValida = true;
        }

        return esFechaValida && esNombreValida && esNombreAutorValida && 
                esApellidoAutorValida && esAdjuntoValida;
    }

    /**
     * Carga todos los datos ingresados en pantalla.
     *
     */
    private void recopilarInformacion() {
        datosDocumento = new Object[8];

        //CARGA_DOCUMENTO 0: Hora
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_HORA] =
                CapaLogica.separarTiempo(
                horaDocumento.getValue().toString());

        //CARGA_DOCUMENTO 1: Fecha
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_FECHA] =
                fechaDocumento.getDate();

        //CARGA_DOCUMENTO 2: Nombre
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_NOMBRE] =
                nombreDocumento.getText();

        //CARGA_DOCUMENTO 3: Nombre autor
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_NOMBRE_AUTOR] =
                nombreAutorDocumento.getText();
        
        //CARGA_DOCUMENTO 4: Apellido autor
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_APELLIDO_AUTOR] =
                apellidoAutorDocumento.getText();
        
        //CARGA_DOCUMENTO 5: Adjunto
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_ADJUNTO] =
                adjuntoDocumento.getText();
        
        //CARGA_DOCUMENTO 6: Comentarios
        datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_COMENTARIOS] =
                comentarioDocumento.getText();
        
        //CARGA_DOCUMENTO 7: Tipo
        if (esConsentimientoInformado) {
            datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_TIPO] = "consentimiento informado";
        } else {
            datosDocumento[
                CapaLogica.CARGA_DOCUMENTO_TIPO] = "ficha de seguimiento";
        }
    }
    
    /**
     * En caso de tratarse de una modificación se debe verificarse que realmente
     * se quiera modificarse.
     *
     * @return true si se debe modificar, false en caso contrario
     */
    public boolean confirmarModificacion() {
        boolean retorno = false;
        if (documentoAVisualizar != null && 
                documentoAVisualizar.getArchivoDocumento() != null) {
            //Confirmar modificación
            int confirmado = MensajePresentacion.confimarModificacionObjeto(
                    "documento", "el");
            if (JOptionPane.OK_OPTION == confirmado) {
                retorno = true;
            } else {
                retorno = false;
            }
        } else {
            retorno = true;
        }
        return retorno;
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEnter = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    agregarOModificarDocumento();
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    dispose();
                }
            }
        };

        //Setear eventos
        filtrar.addKeyListener(keyListenerEnter);
        filtrar.addKeyListener(keyListenerEscape);
        tablaCargaDocumento.addKeyListener(keyListenerEscape);

        botonAnteriorPaginadorUno.addKeyListener(keyListenerEscape);
        botonSiguientePaginadorUno.addKeyListener(keyListenerEscape);

        ((DefaultEditor) horaDocumento.getEditor()).
                getTextField().addKeyListener(keyListenerEnter);
        ((DefaultEditor) horaDocumento.getEditor()).
                getTextField().addKeyListener(keyListenerEscape);

        ((IDateEditor) fechaDocumento.getDateEditor()).
                getUiComponent().addKeyListener(keyListenerEnter);
        ((IDateEditor) fechaDocumento.getDateEditor()).
                getUiComponent().addKeyListener(keyListenerEscape);

        nombreDocumento.addKeyListener(keyListenerEnter);
        nombreDocumento.addKeyListener(keyListenerEscape);
        nombreAutorDocumento.addKeyListener(keyListenerEnter);
        nombreAutorDocumento.addKeyListener(keyListenerEscape);
        apellidoAutorDocumento.addKeyListener(keyListenerEnter);
        apellidoAutorDocumento.addKeyListener(keyListenerEscape);
        botonAdjuntoDocumento.addKeyListener(keyListenerEscape);
        comentarioDocumento.addKeyListener(keyListenerEscape);

        botonAceptar.addKeyListener(keyListenerEscape);
        botonCancelar.addKeyListener(keyListenerEscape);
    }

    /**
     * Inicia el/los paginadores activos en esta ventana
     */
    private void iniciarPaginador() {
        //Rango de filas para cada paginador
        int rangoFilas[] = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];

        //Rango de filas para el paginador 1
        rangoFilas[0] = 5;
        //Rango de filas para el paginador 2
        rangoFilas[1] = 10;
        //Rango de filas para el paginador 3
        rangoFilas[2] = 0;

        Paginador.inicializarPaginador(rangoFilas);
    }

    /**
     * Realiza la paginación hacia atrás.
     */
    private void paginarAtrasTablaDocumento() {
        //Retrocede el los índices
        Paginador.atrasPaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaCargaDocumento.getModel().getColumnCount() > 0) {
               cargarTablaDocumento();
        }
    }

    /**
     * Realiza la paginación hacia adelante, teniendo en cuenta que existan elementos,
     * de lo contrario no procede a listarlos.
     */
    private void paginarAdelanteTablaDocumento() {
        //Adelanta los índices
        Paginador.adelantePaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaCargaDocumento.getModel().getColumnCount() > 0) {
            if (esConsentimientoInformado
                    && DocumentoLogica.getVectorDocumentoPorTipo(
                    "consentimiento informado") == null) {
                Paginador.atrasPaginador(0);
            } else if (!esConsentimientoInformado && DocumentoLogica.
                    getVectorDocumentoPorTipo("ficha de seguimiento") == null) {
                Paginador.atrasPaginador(0);
            }
            cargarTablaDocumento();
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel adjuntoDocumento;
    private javax.swing.JTextField apellidoAutorDocumento;
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonAdjuntoDocumento;
    private javax.swing.JButton botonAnteriorPaginadorUno;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonCargarDocumento;
    private javax.swing.JButton botonEliminarDocumento;
    private javax.swing.JButton botonSiguientePaginadorUno;
    private javax.swing.JTextArea comentarioDocumento;
    private javax.swing.JScrollPane comentarioDocumentoScrollPanel;
    private com.toedter.calendar.JDateChooser fechaDocumento;
    private javax.swing.JTextField filtrar;
    private javax.swing.JSpinner horaDocumento;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTextField nombreAutorDocumento;
    private javax.swing.JTextField nombreDocumento;
    private javax.swing.JPanel paginadorUno;
    private javax.swing.JPanel panelCargaDocumento;
    private javax.swing.JPanel panelVisualizacionCargaDocumento;
    private javax.swing.JTable tablaCargaDocumento;
    private javax.swing.JScrollPane tablaCargaDocumentoScrollPanel;
    private javax.swing.JLabel textoApellidoAutorDocumento;
    private javax.swing.JLabel textoComentarioDocumento;
    private javax.swing.JLabel textoDescriptivoCargaDocumento;
    private javax.swing.JLabel textoDescriptivoVisualizacionCargaDocumento;
    private javax.swing.JLabel textoFiltrar;
    private javax.swing.JLabel textoHoraYFechaDocumento;
    private javax.swing.JLabel textoNombreAutorDocumento;
    private javax.swing.JLabel textoNombreDocumento;
    // End of variables declaration//GEN-END:variables
    private Object[] datosDocumento;
    private Documento documentoACargar;
    private Documento documentoAVisualizar;
    private boolean esConsentimientoInformado;
}